/**
  ******************************************************************************
  * @file    main.c
  * @author  bug2222
  * @version V1.0
  * @date    2025-09-19
  * @brief   WF-ESP8266 WiFi模块测试 - 合并版本（DHT11数据发送 + LED控制）
  ******************************************************************************
  */ 
 
#include "stm32f10x.h"
#include "core_delay.h"
#include "bsp_usart.h"
#include "bsp_SysTick.h"
#include "bsp_esp8266.h"
#include "bsp_esp8266_test.h"
#include "bsp_dht11.h"
#include "bsp_led.h"  
#include "bsp_oled.h"
#include "bsp_relay.h"
#include "bsp_key.h"

#include "flash.h"
#include "Storage_Adapter.h"
#include "watchdog.h"

/* 外部变量声明 */
extern int read_dht11_finish;
DHT11_Storage_Data_TypeDef storage_data;
/**
  * @brief  打印W25Q64中存储的DHT11数据
  * @param  无
  * @retval 无
  */
void Print_W25Q64_DHT11_Data(void)
{
  printf("\r\n=== W25Q64中存储的最新DHT11数据 ===\r\n");
  
  if(DHT11_Storage_HasValidData())
  {
    if(DHT11_Storage_ReadLatestData(&storage_data) == STORAGE_SUCCESS)
    {
      printf("时间戳: %d秒\r\n", storage_data.timestamp);
      printf("温度: %d.%d℃\r\n", storage_data.temp_int, storage_data.temp_deci);
      printf("湿度: %d.%d%%RH\r\n", storage_data.humi_int, storage_data.humi_deci);
      printf("校验和: 0x%02X\r\n", storage_data.check_sum);
      printf("数据状态: %s\r\n", (storage_data.valid_flag == 0xAA) ? "有效" : "无效");
      printf("总记录数: %d\r\n", DHT11_Storage_GetRecordCount());
      printf("存储模式: %s\r\n", 
             (DHT11_Storage_GetMode() == 0) ? "覆盖模式" : "环形缓冲模式");
      
      // 更新OLED显示
      char tempStr[8];
      sprintf(tempStr,"%2d.%d",storage_data.temp_int,storage_data.temp_deci);
      OLED_ShowString(1,6,tempStr);
      
      char humiStr[8];
      sprintf(humiStr,"%2d.%d",storage_data.humi_int,storage_data.humi_deci);
      OLED_ShowString(2,6,humiStr);
    }
    else
    {
      printf("读取W25Q64数据失败\r\n");
    }
  }
  else
  {
    printf("W25Q64中暂无有效数据\r\n");
  }
  printf("================================\r\n");
}

/* 判断复位原因 */
void judgeReset(void){
	/*判断复位信号来源*/
	if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) == SET)	//如果是独立看门狗复位
	{
		printf("WATCHDOG_RESET\r\n");
		RCC_ClearFlag();  // 清除所有复位标志
	}
	else											//否则，即为其他复位
	{
		printf("NORMAL_RESET\r\n");
		RCC_ClearFlag();  // 清除所有复位标志
	}
}

/**
  * @brief  主函数
  * @param  无
  * @retval 无
  */
int main ( void )
{
	Storage_Status_TypeDef storage_status;
	
	/* 初始化 */
  USART_Config ();                                                      //初始化串口1
	judgeReset();
	WATCHDOG_Init();																											//看门狗初始化
	printf("看门狗初始化完成，超时时间约20秒\r\n");
  CPU_TS_TmrInit();                                                     //初始化DWT计数器，用于延时函数
  LED_GPIO_Config();                                                    //初始化RGB彩灯
	RELAY_GPIO_Config();                                                  //初始化继电器
	KEY_GPIO_Config();                                                    //初始化按键
	ESP8266_Init ();                                                      //初始化WiFi模块使用的接口和复位
	DHT11_Init ();                                                        //初始化DHT11
	OLED_Init();
	
	
	printf ( "\r\nWF-ESP8266 WiFi模块综合测试程序 - W25Q64版本\r\n" );     //打印程序启动提示信息
	printf ( "\r\n功能：1.定时发送DHT11温湿度数据  2.接收WiFi命令控制LED  3.DHT11数据W25Q64存储  4.按键控制继电器\r\n" );
	printf ( "\r\nW25Q64存储说明：每2秒自动存储最新DHT11数据到W25Q64外部Flash中\r\n" );
	printf ( "\r\n支持的LED控制命令：\r\n" );
	printf ( "LED_RED, LED_GREEN, LED_BLUE, LED_YELLOW\r\n" );
	printf ( "LED_PURPLE, LED_CYAN, LED_WHITE, LED_RGBOFF\r\n" );
	printf ( "\r\n按键控制说明：按下KEY1(PA0)可切换继电器状态\r\n" );
	
  ESP8266_StaTcpClient_Unvarnish_ConfigTest();                          //对ESP8266进行配置
	SysTick_Init ();                                                      //配置 SysTick 为 10ms 中断一次，在中断里读取传感器数据
  
	
	/* 初始化W25Q64存储系统 */
	printf("\r\n正在初始化W25Q64存储系统...\r\n");
	storage_status = Storage_Init();
	if(storage_status == STORAGE_SUCCESS)
	{
		printf("W25Q64存储系统初始化成功！\r\n");
		
		/* 显示存储系统信息 */
		DHT11_Storage_PrintInfo();
		
		/* 检查现有数据 */
		if(DHT11_Storage_HasValidData())
		{
			printf("发现现有数据，总记录数: %d\r\n", DHT11_Storage_GetRecordCount());
		}
		else
		{
			printf("W25Q64中暂无有效数据\r\n");
		}
	}
	else
	{
		printf("W25Q64存储系统初始化失败！错误码: %d\r\n", storage_status);
		printf("程序将继续运行，但不会保存数据到W25Q64\r\n");
	}

	//温度
	OLED_ShowChinese(1,1,0);
	OLED_ShowChinese(1,2,5);
	OLED_ShowChar(1,5,':');
	OLED_ShowChar(1,10,'C');
	
	//湿度
	OLED_ShowChinese(2,1,1);
	OLED_ShowChinese(2,2,5);
	OLED_ShowChar(2,5,':');	
	OLED_ShowChar(2,10,'%');
	
	OLED_ShowString(3,1,"W25Q64_DATA:");
	OLED_ShowString(4,1,"");
	
	
  static uint32_t watchdog_counter = 0;
  
  while ( 1 )
  {
		IWDG_ReloadCounter();							//喂狗
		watchdog_counter++;
		
    
    // 检查是否有WiFi命令需要处理（LED控制）
    ESP8266_CheckRecvDataTest(); 
    
    // 检查按键状态，控制继电器
    if(KEY_SCAN(KEY1_GPIO_PORT, KEY1_GPIO_PIN) == KEY_ON)
    {
      // 切换继电器状态
      if(RELAY1_GetState())
      {
        RELAY1_OFF();
        printf("\r\n按键按下：继电器已关闭\r\n");
      }
      else
      {
        RELAY1_ON();
        printf("\r\n按键按下：继电器已打开\r\n");
      }
      
      // 延时防抖
      CPU_TS_Tmr_Delay_MS(200);
    }
    
    if( read_dht11_finish ) // read_dht11_finish == 1 or read_dht11_finish == -1
    {
      
      ESP8266_SendDHT11DataTest(); // ESP8266 发送一次温湿度数据
      //printf("read_dht11_finish=%d\r\n", read_dht11_finish);    //Debug
      read_dht11_finish = 0;       // 清除标志位
      /* 打印已存储的数据 */
			Print_W25Q64_DHT11_Data();
      //LED1_TOGGLE;
    }
    
  }
	
	
}



